/**
 *在一个排序的链表中，存在重复的结点，请删除该链表中重复的结点，重复的结点不保留，返回链表头指针。
 * 例如，链表 1->2->3->3->4->4->5  处理后为 1->2->5
 * 
 * Date: 2022-10-01
 * Time: 11:29
 */
public class Algorithm {
    /*
    public ListNode deleteDuplication(ListNode pHead) {
        if(pHead == null || pHead.next == null) {
            return pHead;
        }

        // 自己写的:
        // ListNode head = new ListNode(-1);
        // ListNode tail = head;

        // // 链表至少有两个节点.
        // int target = pHead.val;
        // ListNode prev = pHead;
        // ListNode cur = pHead.next;
        // while(cur != null) {
        //     if(cur.val == prev.val) {
        //         target = cur.val;
        //         prev = cur.next;
        //         if(prev == null) {
        //             break;
        //         }
        //         cur = prev.next;
        //     } else {
        //         if(prev.val != target || prev == pHead) {
        //             tail.next = prev;
        //             tail = tail.next;
        //         }
        //         prev = cur;
        //         cur = cur.next;
        //     }
        // }

        // if(prev != null && prev.next == cur && prev.val != target) {
        //     // 还有最后一个节点未比较
        //     tail.next = prev;
        //     tail = tail.next;
        // }
        // tail.next = null;

        // return head.next;

        // 老师的思路:

        ListNode head = new ListNode(-1);
        head.next = pHead;

        ListNode prev = head;
        ListNode cur = prev.next;

        while(cur != null) {
            while(cur.next != null && cur.val != cur.next.val) {
                // 确定重复区域的起始位置
                prev = prev.next;
                cur = cur.next;
            }
            while(cur.next != null && cur.val == cur.next.val) {
                // 确定重复区域的末尾位置
                cur = cur.next;
            }
            // 重复区域是左闭右开的 [ )


            if(prev.next != cur) {
                // 1. cur.next == null 并确定了一段范围
                // 2. cur.next != null 并确定了一段范围
                prev.next = cur.next;
            }
            cur = cur.next;
            // 3. cur.next == null 没有重复数据  不做处理.
        }

        return head.next;
    }
     */
}
